module uart_rx (
    input clk,
    input rst_n,
    input din,  // pc 发送给 FPGA 的数据
    output reg[7:0] dout,  // 发送给 tx 让他串行的传输出去
    output reg dout_vld,    // 当这一次 8bit 接收完成 再传递给tx
    output reg dout_vld1,    // 当这一次 8bit 接收完成 再传递给tx
    output reg dout_vld2,    // 当这一次 8bit 接收完成 再传递给tx
	 output reg dout_vld3,    // 当这一次 8bit 接收完成 再传递给tx
	 output reg dout_vld4,    // 当这一次 8bit 接收完成 再传递给tx
	 output reg dout_vld5,    // 当这一次 8bit 接收完成 再传递给tx
	 output reg dout_vld6,    // 当这一次 8bit 接收完成 再传递给tx
	 output reg dout_vld7    // 当这一次 8bit 接收完成 再传递给tx
	 
);

    parameter BAUD = 434;  // 使用波特率 115200 发送1 bit 需要的时钟周期


    reg din_r0; // 同步到时钟上升沿 
    reg din_r1; // 打拍 延时一个时钟周期 
    wire nedge; // 下降沿
    reg flag;  // 计数器计数标志 下降沿到来之后开始计数 传输数据完成停止计数
    reg [8:0] data; // 寄存 数据



    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin din_r0<= 1; din_r1<=1;    end
        else begin din_r0<= din; din_r1<= din_r0;   end
    end

    assign nedge = din_r1 && !din_r0; // 下降沿





//  计数一个bit发送需要的时钟周期
    reg [8:0] cnt_bsp; 
    wire add_cnt_bsp; 
    wire end_cnt_bsp; 

    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)     cnt_bsp <= 0;
        else if (add_cnt_bsp)
            if (end_cnt_bsp)    cnt_bsp <= 0;
            else                cnt_bsp <= cnt_bsp + 1; 
        else cnt_bsp <= cnt_bsp;
    end
    assign add_cnt_bsp = flag;
    assign end_cnt_bsp = add_cnt_bsp && (cnt_bsp == BAUD - 1);




// 计数当前到了哪一 bit
    reg [3:0] cnt_bit;          
    wire add_cnt_bit;
    wire end_cnt_bit;

    always @(posedge clk or negedge rst_n)begin

        if (!rst_n)     cnt_bit <= 0;
        else if (add_cnt_bit)
            if (end_cnt_bit)    cnt_bit <= 0;
            else                cnt_bit <= cnt_bit + 1;
        else cnt_bit <= cnt_bit;
    end
    assign add_cnt_bit = end_cnt_bsp;
    assign end_cnt_bit = add_cnt_bit && (cnt_bit == 8); // 起始位 1bit 数据位 8bit 


    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) flag <= 0;
        else if(nedge) flag <= 1;
        else if(end_cnt_bit) flag <= 0;
        else flag <= flag;
    end

    always @(posedge clk or negedge rst_n) begin
        if(!rst_n) data <=0;
        else if(cnt_bsp == BAUD>>1 && flag) data[cnt_bit] <= din; // 串并转换 LSB
        else data <= data; 
    end

    always @(posedge clk or negedge rst_n) begin
        if(!rst_n) begin
            dout <= 8'b0;
            dout_vld <= 0;
            dout_vld1 <= 0;
            dout_vld2 <= 0;
				dout_vld3 <= 0;
				dout_vld4 <= 0;
				dout_vld5 <= 0;
				dout_vld6 <= 0;
				dout_vld7 <= 0;

        end
        else if(end_cnt_bit)
        begin
            dout <= data[8:1]; // 第0位起始位 被舍去 
            dout_vld <= (data[8:1] == 8'h41); //A 欢迎
            dout_vld1 <= (data[8:1] == 8'h42);//B 高速
            dout_vld2 <= (data[8:1] == 8'h43);//C 低速
				dout_vld3 <= (data[8:1] == 8'h44);//D 泊车
				dout_vld4 <= (data[8:1] == 8'h46);//front F
				dout_vld5 <= (data[8:1] == 8'h47);//below G
				dout_vld6 <= (data[8:1] == 8'h4C);//left  L
				dout_vld7 <= (data[8:1] == 8'h52);//right R
        end
        else begin
            dout <= dout;
            //dout_vld <= 0;
        end
    end


endmodule
